package com.itheima.tliasmanagementspringboot.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * AOP入门案例
 * 监测业务层所有方法的执行时间
 */
//切面类和全局异常类一样,最简的,直接写即可
@Component
//@Aspect //标识类为切面类
@Slf4j
public class TimeAspect {

    //环绕通知:需要控制原始方法的结果,所以必须要有返回值,就是原始方法的返回值
    //这个注解,扫描了就将原始方法扫描到了,然后就是创建相应的代理对象,后续都是操作代理对象
    //SpringBoot框架默认用CGLIB实现动态代理,也可以使用JDK的动态代理,可以互相切换
    @Around("execution(public * com.itheima.tliasmanagementspringboot.service.*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        //记录开始时间
        long start = System.currentTimeMillis();

        //调用原始的service中的方法
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        log.info("{} 方法执行耗时 :{}ms", joinPoint.getSignature().getName(), end - start);
        return result;
    }

}